#include <iostream>
using std::cout;
using std::endl;

// 排升序, 使用大于号, 约定成俗
template<class T>
bool AscendingOrder(const T& x, const T& y)
{
	std::cout << typeid(x).name() << std::endl;
	//x = y;
	return x > y;
}

// 第二种解决方案AscendingOrder函数模版的重载
//template<class T>
//bool AscendingOrder(const T*& x, const T*& y)
//{
//	std::cout << typeid(T).name() << std::endl;
//	return *x > *y;
//}

bool F1(const int*& x, const int*& y)
{
	//std::cout << typeid(T).name() << std::endl;
	return x > y;
}

typedef int* Ptr;

int main()
{
//	AscendingOrder(nullptr, nullptr);
	
	bool (*cmp)(const int* const& x, const int* const& y) = AscendingOrder;
//	bool (*cmp)(const int*& x, const int*& y) = F1;
//	int a = 1;
//	int b = 2;
////	const int* pa = &a;
////	const int* pb = &b;
//	int* pa = &a;
//	int* pb = &b;
//	AscendingOrder(pa, pb);
//	
//	const Ptr p1 = &a;
//	int* const p2 = &a;
	
	
	
	//p1 = &b;
	
//	cmp(pa, pb);
//	int* const & qpq = pa;
//	int*& qpa = pa;
//	int* const& cqpa = pa;
//	//double& qa = a;
//	const int& qa = a;
//	int const& cqa = a;
//	//int& const qca = a;
//	const int& qx = 1;
//	int const& qy = 1;
//	
//	double x = 1.2;
//	const int& qx = (int)x;

	return 0;
}




















//void test(int x, int y)
//{
//	cout << endl;
////	cout << "void test(int x, int y)" << endl;
////}
////
//template<class T1, class T2>
//void test(T1 x, T2 y)
//{
//	cout << endl;
//	cout << typeid(T1).name() << " " << typeid(T2).name() << endl;
//	cout << "void test(T1 x, T2 y)" << endl;
//}
//
//template<class T>
//void test(T x, T y)
//{
//	cout << endl;
//	cout << typeid(T).name() << endl;
//	cout << "void test(T x, T y)" << endl;
//}
//
//template<class T>
//void test(T* x, T* y)
//{
//	cout << endl;
//	cout << typeid(T).name() << endl;
//	cout << "void test(T* x, T* y)" << endl;
//}
//
//template<class T1>
//void test(T1* x, double* y)
//{
//	cout << endl;
//	cout << typeid(T1).name() << endl;
//	cout << "void test(T* x, double* y)" << endl;
//}
//
//int main()
//{
////	test(1, 2); // 调用手动定义函数
////	test(1.2, 2.3); // 调用实例化生成函数
////	test(1, 2.2); // 调用手动定义函数
//	int a = 1;
//	double b = 2;
//	test<int*, double*>(&a, &b);
//	test(&a, &b);
//	//void (* ptest)(T1* x, double* y) = test;
//	void (* ptest)(int* x, double* y) = test;
//	ptest(&a, &b);
////	test(1, 2);
//	
//	return 0;
//}
//




























//template<class T>
//void Add(T x, T y)
//{
//	cout << "void Add(T x, T y)" <<endl;
//	cout << typeid(T).name() << endl;
////	cout << *x << endl;
//	cout << x + y << endl;
//	
//}
//
//template<>
//void Add<int>(int x, int y)
//{
//	cout << "void Add<int>(int x, int y)" << endl;
//	cout << x + y << endl;
//}
//
//// 如何让一个函数模版仅匹配指针类型
//// 如何写一个专门匹配指针类型的模版特化
//
////template<class T>
////void Add(T* x, T* y)
////{
////	cout << typeid(T).name() << endl;
////	cout << typeid(T*).name() << endl;
////	cout << *x + *y << endl;
////}
//
//int main()
//{
//	int a = 1;
//	int b = 2;
//	Add(a, b);
//	
//	double a2 = 3.0;
//	double b2 = 4.0;
//	Add(a2, b2);
//	//Add(&a, &b);
//	
//	return 0;
//}
